package com.cowmooed.service.impl;

import com.cowmooed.dto.*;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;
import java.util.List;

@Slf4j
@Service
public class SmartFormService {

    private final ObjectMapper objectMapper = new ObjectMapper();
    private final RestTemplate restTemplate = new RestTemplate();

    // 七牛云DeepSeek API配置
    private static final String QINIU_API_BASE_URL = "https://openai.qiniu.com/v1";
    private static final String DEEPSEEK_MODEL = "deepseek-v3-0324";

    /**
     * 获取智能表单推荐
     */
    public SmartFormRecommendationDTO getSmartRecommendation(SmartFormRequestDTO request) {
        try {
            // 构建AI提示词
            String prompt = buildAIPrompt(request);
            log.info("发送AI请求，设备评分: {}, 用户提示: '{}'",
                    request.getDeviceScore() != null ? request.getDeviceScore().getLevel() : "unknown",
                    request.getUserPrompt());

            // 调用AI服务
            String aiResponse = callDeepSeekAPI(prompt);

            // 解析AI响应
            SmartFormRecommendationDTO recommendation = parseAIResponse(aiResponse);

            log.info("AI推荐生成成功");
            return recommendation;

        } catch (Exception e) {
            log.error("AI推荐生成失败: {}", e.getMessage(), e);
            // 返回基于设备评分的容错推荐
            return generateFallbackRecommendation(request.getDeviceScore(), request.getUserPrompt());
        }
    }

    /**
     * 构建AI提示词
     */
    private String buildAIPrompt(SmartFormRequestDTO request) {
        StringBuilder prompt = new StringBuilder();

        prompt.append("你是一个3D模型生成助手，需要根据用户设备信息和需求，为用户智能推荐最适合的参数选项。\n\n");

        // 用户提示词（最高优先级）
        if (request.getUserPrompt() != null && !request.getUserPrompt().trim().isEmpty()) {
            prompt.append("用户需求描述: ").append(request.getUserPrompt()).append("\n");
            prompt.append("注意: 用户需求是最重要的，设备推荐应该在满足用户需求的前提下进行优化。\n\n");
        }

        // 设备信息
        if (request.getDeviceScore() != null) {
            prompt.append("设备性能评估:\n");
            prompt.append("- 综合评分: ").append(request.getDeviceScore().getTotalScore()).append("/100\n");
            prompt.append("- 性能等级: ").append(request.getDeviceScore().getLevel()).append("\n");
            if (request.getDeviceScore().getBreakdown() != null) {
                prompt.append("- 详细评分: CPU(").append(request.getDeviceScore().getBreakdown().get("cpu"))
                        .append("), 内存(").append(request.getDeviceScore().getBreakdown().get("memory"))
                        .append("), GPU(").append(request.getDeviceScore().getBreakdown().get("gpu"))
                        .append("), 网络(").append(request.getDeviceScore().getBreakdown().get("network"))
                        .append(")\n");
            }
        }

        if (request.getDeviceInfo() != null) {
            DeviceInfoDTO device = request.getDeviceInfo();
            prompt.append("\n设备详细信息:\n");

            // 设备类型
            if (device.getDeviceType() != null) {
                prompt.append("- 设备类型: ").append(device.getDeviceType().getType()).append("\n");
            }

            // CPU信息
            if (device.getCpu() != null) {
                prompt.append("- CPU: ").append(device.getCpu().getCores()).append("核心");
                if (device.getCpu().getEstimatedPerformance() != null) {
                    prompt.append("，性能等级: ").append(device.getCpu().getEstimatedPerformance().getPerformance());
                }
                prompt.append("\n");
            }

            // 内存信息
            if (device.getMemory() != null && device.getMemory().getDeviceMemory() != null) {
                prompt.append("- 内存: ").append(device.getMemory().getDeviceMemory()).append("GB\n");
            }

            // GPU信息
            if (device.getGpu() != null) {
                prompt.append("- GPU: ");
                if (device.getGpu().getWebgl2Supported() != null && device.getGpu().getWebgl2Supported()) {
                    prompt.append("支持WebGL2");
                } else if (device.getGpu().getWebglSupported() != null && device.getGpu().getWebglSupported()) {
                    prompt.append("支持WebGL");
                } else {
                    prompt.append("GPU支持有限");
                }
                if (device.getGpu().getRenderer() != null) {
                    prompt.append("，GPU型号: ").append(device.getGpu().getRenderer());
                }
                prompt.append("\n");
            }

            // 网络信息
            if (device.getNetwork() != null) {
                prompt.append("- 网络: ");
                if (device.getNetwork().getEffectiveType() != null) {
                    prompt.append(device.getNetwork().getEffectiveType().toUpperCase());
                }
                if (device.getNetwork().getSpeedTest() != null && device.getNetwork().getSpeedTest().getLatency() != null) {
                    prompt.append("，延迟: ").append(device.getNetwork().getSpeedTest().getLatency().intValue()).append("ms");
                }
                prompt.append("\n");
            }
        }

        prompt.append("\n请为用户推荐最适合的参数配置。选项枚举值不能更改，只能调整desc、tag、tagType、reason字段。");
        prompt.append("你的回答需要是有效的JSON格式，包含以下结构:\n");
        prompt.append("{\n");
        prompt.append("  \"faceOptions\": [\n");
        prompt.append("    {\"value\": 50000, \"label\": \"5万面\", \"desc\": \"AI生成的描述\", \"tag\": \"AI生成的标签\", \"tagType\": \"success/info/warning\", \"reason\": \"选择理由\"},\n");
        prompt.append("    {\"value\": 150000, \"label\": \"15万面\", \"desc\": \"...\", \"tag\": \"...\", \"tagType\": \"...\", \"reason\": \"...\"},\n");
        prompt.append("    {\"value\": 300000, \"label\": \"30万面\", \"desc\": \"...\", \"tag\": \"...\", \"tagType\": \"...\", \"reason\": \"...\"}\n");
        prompt.append("  ],\n");
        prompt.append("  \"generateTypeOptions\": [\n");
        prompt.append("    {\"value\": \"Normal\", \"name\": \"标准模型\", \"desc\": \"AI生成的描述\", \"tag\": \"AI生成的标签\", \"tagType\": \"success/info/warning\", \"reason\": \"选择理由\"},\n");
        prompt.append("    {\"value\": \"LowPoly\", \"name\": \"低多边形\", \"desc\": \"...\", \"tag\": \"...\", \"tagType\": \"...\", \"reason\": \"...\"},\n");
        prompt.append("    {\"value\": \"Geometry\", \"name\": \"纯几何\", \"desc\": \"...\", \"tag\": \"...\", \"tagType\": \"...\", \"reason\": \"...\"}\n");
        prompt.append("  ],\n");
        prompt.append("  \"taskVersionRecommendation\": {\"recommended\": \"pro/rapid\", \"reason\": \"推荐理由\"},\n");
        prompt.append("  \"enablePBRRecommendation\": {\"recommended\": true/false, \"reason\": \"推荐理由\"}\n");
        prompt.append("}\n\n");

        prompt.append("推荐原则:\n");
        prompt.append("1. 优先满足用户明确表达的需求\n");
        prompt.append("2. 高性能设备(level=high)推荐高质量选项，低性能设备(level=low)推荐快速选项\n");
        prompt.append("3. 网络条件差的用户优先推荐轻量选项\n");
        prompt.append("4. tagType使用: success(推荐), info(普通), warning(需要注意)\n");
        prompt.append("5. 创意地生成个性化的tag和desc，但要专业准确\n");
        prompt.append("6. 每个选项都要给出具体的选择理由\n");
        prompt.append("7. desc长度在10~20个字符之间，tag不超过6个字符");

        return prompt.toString();
    }

    /**
     * 调用七牛云DeepSeek API
     */
    private String callDeepSeekAPI(String prompt) throws Exception {
        String apiKey = "sk-07c8ec0cd1621fceb1038134cdba52bfcc069cdc49235e609827d1247d053728";

        // 构建请求头
        HttpHeaders headers = new HttpHeaders();
        headers.set("Authorization", "Bearer " + apiKey);
        headers.set("Content-Type", "application/json");

        // 构建请求体
        ObjectNode requestBody = objectMapper.createObjectNode();
        requestBody.put("stream", false);
        requestBody.put("model", DEEPSEEK_MODEL);

        // 构建消息数组
        ArrayNode messages = objectMapper.createArrayNode();

        // 系统消息
        ObjectNode systemMessage = objectMapper.createObjectNode();
        systemMessage.put("role", "system");
        systemMessage.put("content", "你是一个专业的3D模型生成助手，能够根据用户设备信息和需求提供智能推荐。请只返回有效的JSON格式，不要包含任何其他文字。");
        messages.add(systemMessage);

        // 用户消息
        ObjectNode userMessage = objectMapper.createObjectNode();
        userMessage.put("role", "user");
        userMessage.put("content", prompt);
        messages.add(userMessage);

        requestBody.set("messages", messages);

        // 设置其他参数
        requestBody.put("temperature", 0.7);
        requestBody.put("max_tokens", 2000);

        // 创建HTTP请求
        HttpEntity<String> request = new HttpEntity<>(objectMapper.writeValueAsString(requestBody), headers);

        try {
            // 发送请求
            ResponseEntity<String> response = restTemplate.exchange(
                    QINIU_API_BASE_URL + "/chat/completions",
                    HttpMethod.POST,
                    request,
                    String.class
            );

            log.info("DeepSeek API响应状态: {}", response.getStatusCode());

            // 解析响应
            JsonNode responseJson = objectMapper.readTree(response.getBody());
            String content = responseJson.at("/choices/0/message/content").asText();

            log.info("AI推荐表单: {}", content);
            return content;

        } catch (Exception e) {
            log.error("调用DeepSeek API失败: {}", e.getMessage(), e);
            throw new RuntimeException("AI服务调用失败: " + e.getMessage(), e);
        }
    }

    /**
     * 解析AI响应
     */
    private SmartFormRecommendationDTO parseAIResponse(String aiResponse) {
        try {
            // 清理响应内容，移除可能的markdown代码块标记
            String cleanedResponse = aiResponse.trim();
            if (cleanedResponse.startsWith("```json")) {
                cleanedResponse = cleanedResponse.substring(7);
            }
            if (cleanedResponse.endsWith("```")) {
                cleanedResponse = cleanedResponse.substring(0, cleanedResponse.length() - 3);
            }
            cleanedResponse = cleanedResponse.trim();

            return objectMapper.readValue(cleanedResponse, SmartFormRecommendationDTO.class);
        } catch (Exception e) {
            log.error("解析AI响应失败: {}, 响应内容: {}", e.getMessage(), aiResponse);
            throw new RuntimeException("AI响应解析失败", e);
        }
    }

    /**
     * 生成容错推荐
     */
    private SmartFormRecommendationDTO generateFallbackRecommendation(DeviceScoreDTO deviceScore, String userPrompt) {
        log.info("使用容错推荐机制");

        String deviceLevel = deviceScore != null ? deviceScore.getLevel() : "medium";

        // 基于设备性能的基础推荐
        List<FormOptionDTO> faceOptions;
        List<FormOptionDTO> generateTypeOptions;
        SmartFormRecommendationDTO.TaskVersionRecommendation taskVersion;
        SmartFormRecommendationDTO.EnablePBRRecommendation enablePBR;

        switch (deviceLevel) {
            case "high":
                faceOptions = Arrays.asList(
                        FormOptionDTO.builder().value(50000).label("5万面").desc("快速预览").tag("快速").tagType("info").reason("快速生成预览模型").build(),
                        FormOptionDTO.builder().value(150000).label("15万面").desc("标准质量").tag("平衡").tagType("success").reason("质量与性能的良好平衡").build(),
                        FormOptionDTO.builder().value(300000).label("30万面").desc("高质量细节").tag("推荐").tagType("success").reason("您的设备性能优秀，推荐使用高质量模型").build()
                );
                generateTypeOptions = Arrays.asList(
                        FormOptionDTO.builder().value("Normal").name("标准模型").desc("完整功能模型").tag("推荐").tagType("success").reason("标准选择，功能完整").build(),
                        FormOptionDTO.builder().value("LowPoly").name("低多边形").desc("轻量化模型").tag("性能优先").tagType("info").reason("适合实时渲染场景").build(),
                        FormOptionDTO.builder().value("Geometry").name("纯几何").desc("纯几何结构").tag("轻量").tagType("info").reason("最轻量的选择").build()
                );
                taskVersion = SmartFormRecommendationDTO.TaskVersionRecommendation.builder()
                        .recommended("pro").reason("您的设备性能优秀，推荐专业版获得更多功能").build();
                enablePBR = SmartFormRecommendationDTO.EnablePBRRecommendation.builder()
                        .recommended(true).reason("设备支持PBR材质，建议启用获得更好效果").build();
                break;

            case "low":
                faceOptions = Arrays.asList(
                        FormOptionDTO.builder().value(50000).label("5万面").desc("快速生成").tag("推荐").tagType("success").reason("针对您的设备优化，确保流畅体验").build(),
                        FormOptionDTO.builder().value(150000).label("15万面").desc("标准质量").tag("可选").tagType("info").reason("中等质量选择").build(),
                        FormOptionDTO.builder().value(300000).label("30万面").desc("高质量").tag("谨慎选择").tagType("warning").reason("可能影响生成速度").build()
                );
                generateTypeOptions = Arrays.asList(
                        FormOptionDTO.builder().value("Normal").name("标准模型").desc("标准功能").tag("标准").tagType("info").reason("基础功能模型").build(),
                        FormOptionDTO.builder().value("LowPoly").name("低多边形").desc("性能优化").tag("推荐").tagType("success").reason("专为您的设备优化，性能更佳").build(),
                        FormOptionDTO.builder().value("Geometry").name("纯几何").desc("最轻量").tag("高效").tagType("success").reason("最快的生成速度").build()
                );
                taskVersion = SmartFormRecommendationDTO.TaskVersionRecommendation.builder()
                        .recommended("rapid").reason("基于设备性能，推荐快速版获得更流畅体验").build();
                enablePBR = SmartFormRecommendationDTO.EnablePBRRecommendation.builder()
                        .recommended(false).reason("建议关闭PBR以提升生成速度").build();
                break;

            default: // medium
                faceOptions = Arrays.asList(
                        FormOptionDTO.builder().value(50000).label("5万面").desc("快速预览").tag("快速").tagType("info").reason("快速生成预览").build(),
                        FormOptionDTO.builder().value(150000).label("15万面").desc("推荐选择").tag("推荐").tagType("success").reason("适合您的设备配置，平衡质量与性能").build(),
                        FormOptionDTO.builder().value(300000).label("30万面").desc("高质量").tag("高质量").tagType("warning").reason("高质量选择，生成时间较长").build()
                );
                generateTypeOptions = Arrays.asList(
                        FormOptionDTO.builder().value("Normal").name("标准模型").desc("标准推荐").tag("推荐").tagType("success").reason("最佳的功能平衡选择").build(),
                        FormOptionDTO.builder().value("LowPoly").name("低多边形").desc("性能友好").tag("性能").tagType("info").reason("更好的性能表现").build(),
                        FormOptionDTO.builder().value("Geometry").name("纯几何").desc("轻量选择").tag("轻量").tagType("info").reason("轻量化快速选择").build()
                );
                taskVersion = SmartFormRecommendationDTO.TaskVersionRecommendation.builder()
                        .recommended("rapid").reason("推荐快速版，生成速度更快").build();
                enablePBR = SmartFormRecommendationDTO.EnablePBRRecommendation.builder()
                        .recommended(false).reason("为确保流畅体验，建议关闭PBR材质").build();
        }

        return SmartFormRecommendationDTO.builder()
                .faceOptions(faceOptions)
                .generateTypeOptions(generateTypeOptions)
                .taskVersionRecommendation(taskVersion)
                .enablePBRRecommendation(enablePBR)
                .build();
    }
}